﻿using AutoMapper;
using ExcellentProjectPlus.Dominio.Seguridades.Entidades;
using ExcellentProjectPlus.Seguridades.Docentes;
using Servicios.Seguridad.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;

namespace Servicios.Seguridad.Controllers
{
    [Authorize (Roles="Administrador, Docente")]
    public class DocentesController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDeDocentes _servicioDeGestionDeDocentes;
        #endregion

        #region Constructores
        public DocentesController(IServicioDeGestionDeDocentes servicioDeGestionDeDocentes)
        {            
            _servicioDeGestionDeDocentes = servicioDeGestionDeDocentes;
            Mapper.CreateMap<Docente, PersonaModel>();
        }
        #endregion

        public IHttpActionResult Get()
        {
            return Ok(Mapper.Map<IEnumerable<Docente>, IEnumerable<PersonaModel>>
                (_servicioDeGestionDeDocentes.ObtenerDocentes()));
        }


        [ResponseType(typeof(PersonaModel))]
        public IHttpActionResult GetDocente(int id)
        {
            Docente docente = _servicioDeGestionDeDocentes.ObtenerDocentePorId(id);
            if (docente == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Docente, PersonaModel>(docente));
        }


        [ResponseType(typeof(List<PersonaModel>))]
        [Route("~/api/docentes/")]
        public IHttpActionResult GetDocentes()
        {

            return Ok(Mapper.Map<IEnumerable<Docente>, IEnumerable<PersonaModel>>
                (_servicioDeGestionDeDocentes.ObtenerDocentes()));


        }       

        [ResponseType(typeof(Docente))]
        public IHttpActionResult Post(Docente docente)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDeDocentes.AgregarDocente(docente);

            return CreatedAtRoute("DefaultApi", new { id = docente.Id }, docente);
        }


        public IHttpActionResult Put(int id, Docente docente)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != docente.Id)
            {
                return BadRequest();
            }

            _servicioDeGestionDeDocentes.ModificarDocente(docente);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ResponseType(typeof(Docente))]
        public IHttpActionResult Delete(int id)
        {
            Docente docente = _servicioDeGestionDeDocentes.ObtenerDocentePorId(id);
            if (docente == null)
            {
                return NotFound();
            }

            _servicioDeGestionDeDocentes.EliminarDocente(docente);

            return Ok(docente);
        }



        private bool DocenteExists(int id)
        {
            return _servicioDeGestionDeDocentes.ObtenerDocentePorId(id) != null;
        }


        [Route("~/api/docentes/obtenerpornombre/{usuario}")]
        [ResponseType(typeof(EstudianteModel))]
        public IHttpActionResult GetDatosEstudiante(string usuario)
        {
            Docente docente = _servicioDeGestionDeDocentes.ObtenerDocentePorNombreUsuario(usuario);
            if (docente == null)
            {
                return NotFound();
            }
            return Ok(docente);
        }
    }
}
